Design Considerations
为了确保SDK的互通性、兼容性和开放性,支持各种不同形式的第三方账号(例如:昵称、Email地址、手机号码或APP账号等),以及隐藏底层通信系统的具体实现细节和降低第三方应用程序开发的复杂度, SDK在设计上遵循了以下基本原则:
统一身份标识:
SDK在系统内部,统一采用通信号码的形式唯一地标识每个用户,APP可以通过绑定操作,将指定的APP账号与分配的通信号码关联起来。这样,对于不同形式的APP账号,在通信系统内部可以按照通信号码的形式实现用户身份标识的统一管理和控制,确保不同APP之间的互联互通性。
此外,APP在调用SDK API接口时需使用通信号码作为目标参数,但是对最终用户而言,通信号码是透明的、不可见的,APP可通过SDK的查询账号接口获得每个APP账号对应的通信号码。
APP账号与通信号码之间的关系如下图所示:
注:通过统一身份标识,SDK可支持不同APP账号形式之间的相互通信。
统一消息格式:
SDK系统中统一采用MIME编码格式来定义各种即时消息的类型,基本格式是“type/subtype”,例如:
| 消息类型 | MIME编码 |
|---|---|
| 文本字符串 | text/plain |
| 图片文件 | image/{png,jpeg...} |
| 语音文件 | audio/{amr,3gp,mp3} |
| 视频文件 | video/{mpeg ,mp4,avi,asf,mov} |
| 其他类型文件 | application/{pdf ,msword,octet-stream...} |
| JSON字符串 | application/json |
需要注意的是,即时消息的类型并不限于上述定义,APP可根据自己的需要,灵活地扩展新的MIME类型和相应的功能,而SDK在传输消息时,可确保MIME类型的透明传输。
统一编码格式:
为了兼容不同语言的字符串,避免不同语言、不同平台之间出现乱码,SDK在系统内部统一采用UTF-8编码。
SDK API接口的输入参数以及返回值均采用UTF-8编码,SDK使用者需要在上层完成相关字符串编码格式的转换。与此同时,SDK也提供UNICODE字符串与UTF-8字符串相互转换辅助接口函数。
异步接口操作:
为降低APP和SDK之间的操作耦合度,提高程序的运行效率和可响应性,所有涉及消息和通话功能的接口(一般需要访问网络且耗时较长),均采用非阻塞式模式来处理APP的调用请求,即APP在调用SDK API接口之后可立刻返回APP继续运行,而SDK的处理结果则通过相应的SDK回调函数,异步地返回给APP,因此APP不必进行耗时的等待,造成主线程的阻塞,使应用程序失去响应。
此外,APP和SDK之间采用消息/呼叫请求的ID来匹配异步的请求和响应。
例如:
- ① APP发送消息时,SDK接口会立刻返回消息ID给APP,同时采用多线程方式进行消息传输;
- ②消息发送成功后,SDK通过回调函数通知APP,并在回调参数中指明成功发送的消息ID;
- ③ APP通过消息ID,可定位具体的消息内容,并更新消息的传输状态。
每个异步操作接口均有相应的回调函数。APP应该实现这些回调函数,并通过SDK接口将回调函数的入口传递给SDK,以便SDK进行调用。
需要注意的是,APP不能在回调函数接口中执行长时任务,以避免阻塞SDK执行其它回调任务。因此,APP在设计回调函数时,可根据操作系统本身的机制,实现SDK通知的异步处理。
建议:
- 1)在Windows系统中,可采用Windows消息机制,在回调函数中将SDK通知转换为Windows消息,然后通过发送到相关的Windows窗口的消息队列中实现异步处理。
- 2)在iOS系统中,可采用GCD技术,在回调函数中将SDK通知处理转移到其它非主线程中进行异步执行。
- 3)在Android系统中,可采用Broadcast技术,在回调函数中将SDK通知的内容广播给相应的Activity进行处理。
简化通信业务流程:
对于音视频通信,SDK以通话状态机为核心,向上层APP提供完备的通话控制功能,包括:发起、接听/拒接和挂断等,隐藏底层网络传输路径、会话控制信令、呼叫建立流程以及音视频信息处理等具体实现细节,以降低上层APP软件开发的复杂度。